package cnsatmsmart.automation.mmi.controller.Buffer;

import java.util.Calendar;
import java.util.GregorianCalendar;

/**
 * Merupakan kelas yang berisi data pesawat
 * @author SIK - PTIK, BPPT
 */
public class Flight
{
    /*** atrbibut-atribut yang dimiliki oleh kelas Flight ***/
        private String Code;
        private String CallSign;
        private String Country;
        private float Altitude;
        private float GroundSpeed;
        private float Trackangle;
        private float Verticalrate;
        private float Latitude;
        private float Longitude;
        private String TimeOfDay;
        private String strLastUpdate;
        private int State;              //0=datar, -1=turun, 1=naik
        private boolean Status;         //true=peswat, false=bukan pesawat
        private long LastUpdate;
    
        /*** constructor - user defined constructor, no default constructor **
         * @param code Code pesawat
         * @param trackangle Trackangle pesawat
         * @param country Country pesawat
         * @param callSign Call sign pesawat
         * @param groundspeed Groundspeed pesawat
         * @param altitude Altitude pesawat
         * @param latitude Latitude pesawat
         * @param verticalrate Verticalrate pesawat
         * @param lastUpdate Last update pesawat
         * @param timeOfDay Time of day pesawat
         * @param longitude Longitude pesawat
         * @param state State pesawat
         */
        public Flight(String code, String callSign, String country, float altitude, float groundspeed, float trackangle, float verticalrate, float latitude, float longitude, String timeOfDay, long lastUpdate, int state)
        {   
            this.Code = code;
            this.CallSign = callSign;
            this.Country = country;
            this.Altitude = altitude;
            this.GroundSpeed = groundspeed;
            this.Trackangle = trackangle;
            this.Verticalrate = verticalrate;
            this.Latitude = latitude;
            this.Longitude = longitude;
            this.TimeOfDay = timeOfDay;
            this.strLastUpdate = getTimeNow();
            this.LastUpdate = lastUpdate;
            this.State = state;

            if (this.GroundSpeed == 0 || this.Latitude == 0 || this.Longitude == 0) this.Status = false;
            else this.Status = true;
        }

        /**
         * Copy Constructor
         * @param another Objek Flight yang akan disalin
         */
        public Flight(Flight another){
        this(another.getCode(), another.getCallSign(), another.getCountry(), another.getAltitude(), another.getGroundSpeed(), another.getTrackangle(), another.getVerticalrate(), another.getLatitude(), another.getLongitude(), another.getTimeOfDay(), another.getLastUpdate(), another.getState());
    }

    /**
     * Fungsi untuk mendapatkan waktu saat ini
     * @return  Waktu saat ini dalam format HH:MM:SS
     */
    public static String getTimeNow()
    {
        Calendar calendar = new GregorianCalendar();
        
        int hour = calendar.get(Calendar.HOUR);
        int minute = calendar.get(Calendar.MINUTE);
        int second = calendar.get(Calendar.SECOND);

        if(calendar.get(Calendar.AM_PM) != 0) hour+=12;
        String TimeNow = hour + ":" + minute + ":" + second;

        return TimeNow;
    }
    
    /*** getter **/
    /**
     * Mengembalikan Latitude pesawat
     * @return Latitude
     */
    public float getLatitude()
    {
        /* mengembalikan nilai dari atribut Latitude */
            return Latitude;
    }

    /**
     * Mengembalikan longitude pesawat
     * @return Longitude
     */
    public float getLongitude()
    {
        /* mengembalikan nilai dari atribut Longitude */
            return Longitude;
    }

    /**
     * Mengembalikan call sign pesawat
     * @return Call Sign
     */
    public String getCallSign()
    {
        /* mengembalikan nilai dari atribut CallSign */
            return CallSign;
    }

    /**
     * Mengembalikan last update pesawat
     * @return Last Update
     */
    public long getLastUpdate()
    {
        /* mengembalikan nilai dari atribut LastUpdate */
            return LastUpdate;
    }

    /**
     * Mengembalikan altitude pesawat
     * @return Altitude
     */
    public float getAltitude()
    {
        /* mengembalikan nilai dari atribut Altitude */
            return Altitude;
    }

    /**
     * Mengembalikan code pesawat
     * @return Code
     */
    public String getCode()
    {
        /* mengembalikan nilai dari atribut Code */
            return Code;
    }

    /**
     * Mengembalikan country pesawat
     * @return Country
     */
    public String getCountry()
    {
        /* mengembalikan nilai dari atribut Country */
            return Country;
    }

    /**
     * Mengembalikan ground speed pesawat
     * @return Ground Speed
     */
    public float getGroundSpeed()
    {
        /* mengembalikan nilai dari atribut GroundSpeed */
            return GroundSpeed;
    }

    /**
     * Mengembalikan time of day
     * @return Time Of Day
     */
    public String getTimeOfDay()
    {
        /* mengembalikan nilai dari atribut TimeOfDay */
            return TimeOfDay;
    }

    /**
     * Mengembalikan trackangle pesawat
     * @return Trackangle
     */
    public float getTrackangle()
    {
        /* mengembalikan nilai dari atribut Trackangle */
            return Trackangle;
    }

    /**
     * Mengembalikan vertical rate pesawat
     * @return Vertical Rate
     */
    public float getVerticalrate()
    {
        /* mengembalikan nilai dari Verticalrate */
            return Verticalrate;
    }

    /**
     * Mengembalikan last update pesawat dalam bentuk string
     * @return
     */
    public String getstrLastUpdate()
    {
        /* mengembalikan nilai dari Last update yang merupakan waktu komputer */
            return strLastUpdate;
    }

    /**
     * Mengembalikan state pesawat.
     * State 1 berarti pesawat dalam keadaan naik.
     * State -1 berarti pesawat dalam keadaan turun.
     * State 0 berarti pesawat dalam keadaan mendatar.
     * @return State pesawat, apakah sedang naik, turun, atau mendatar
     */
    public int getState()
    {
        /* mengembalikan nilai dari State */
            return State;
    }

    /**
     * Mengembalikan status.
     * Status 1 berarti pesawat.
     * Status 0 berarti bukan pesawat.
     * @return Status, apakah pesawat atau bukan
     */
    public boolean getStatus()
    {
        /* mengembalikan nilai dari Status */
            return Status;
    }
}
